package com.baizhi.controller;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.captcha.ShearCaptcha;
import com.baizhi.annotation.LogAnnotation;
import com.baizhi.entity.CmfzAdmin;
import com.baizhi.service.CmfzAdminService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("cmfzAdmin")
@Slf4j
public class CmfzAdminController {
    @Autowired
    private CmfzAdminService cmfzAdminService;

    @RequestMapping("getCaptcha")
    public void getCaptcha(HttpSession session, HttpServletResponse response){
        //1、获得一个验证码对象  利用hutool工具类
        LineCaptcha captcha = CaptchaUtil.createLineCaptcha(100, 30);
        //2、将验证码内容保存到session中
        String code = captcha.getCode();
        log.info("验证码内容："+code);
//        session.setAttribute("code",code);
        /**补充：集成shiro后  shiro中的主体Subject对象也可以获取session
            这个session虽然不是HttpSession  但和HttpSession操作的session空间是同一个  也可以使用
         */
        Session shiroSession = SecurityUtils.getSubject().getSession();
        shiroSession.setAttribute("code",code);
        //3、将验证码对象响应给浏览器
        try {
            captcha.write(response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @RequestMapping("login")
    @LogAnnotation(content = "管理员登陆功能",type = "登陆")
    public Map login(String username, String password,String code, HttpSession session){
        Map map = new HashMap();
        String realcode = (String) session.getAttribute("code");
        if(realcode!=null && realcode.equals(code)){
            CmfzAdmin cmfzAdmin = cmfzAdminService.login(username, password);
            if(cmfzAdmin!=null){
                map.put("flag",true);
                session.setAttribute("login",cmfzAdmin);
            }else {
                map.put("flag",false);
                map.put("massge","账号或密码不正确");
            }
        }else {
            map.put("flag",false);
            map.put("massge","验证码不正确");
        }
        return map;
    }
    /*
    * 集成shiro后  使用shiro实现认证登陆功能  调用对应的业务层认证方法
    * */
    @RequestMapping("shiroLogin")
    @LogAnnotation(content = "shiro实现管理员认证功能",type = "登陆")
    public Map shiroLogin(String username,String password,String code){
        //这里不用HttpSession的形参  因为shiro中的subject对象也可以获得session
        Map map = new HashMap();
        //1、获取subject对象 并获取session
        Session session = SecurityUtils.getSubject().getSession();
        String realcode = (String) session.getAttribute("code");
        //2、验证码 验证
        if(realcode!=null && realcode.equals(code)){
            //3、调用业务层shiro认证方法
            boolean shiroLogin = cmfzAdminService.shiroLogin(username, password);
            if(shiroLogin){
                map.put("flag",true);
                /*
                CmfzAdmin cmfzAdmin = cmfzAdminService.login(username, password);
                session.setAttribute("login",cmfzAdmin);
                直接在自定义授权realm类中  就保存登陆标识就行
                */
            }else {
                map.put("flag",false);
                map.put("massge","账号或密码不正确");
            }
        }else {
            map.put("flag",false);
            map.put("massge","验证码不正确");
        }
        return map;
    }

    @RequestMapping("add")
    @LogAnnotation(content = "添加管理员功能",type = "添加")
    public Map add(CmfzAdmin cmfzAdmin){
        Map map = new HashMap();
        try {
            cmfzAdminService.insertCmfzAdmin(cmfzAdmin);
            map.put("flag",true);
        } catch (Exception e) {
            map.put("flag",false);
        }
        return map;
    }
    @RequestMapping("show")
    @LogAnnotation(content = "查询管理员功能",type = "查询")
    public Map show(Integer page,Integer limit){
        Map map = new HashMap();
        Page<CmfzAdmin> cmfzAdminPage = cmfzAdminService.selectPage(page, limit);
        map.put("code",0);
        map.put("msg","");
        map.put("count",cmfzAdminPage.getTotal());
        map.put("data",cmfzAdminPage.getRecords());
        return map;
    }
}
